Webpack 5ã®JavaScriptã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã§ãã€ã¯ãããã³ããšã³ãã®åãè§£ãæŸã¡ãŸããããã¹ã±ãŒã©ãã«ã§ä¿å®æ§ãé«ããç¬ç«ããWebã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯æ¹æ³ãåŠã³ãŸãã
Webpack 5ã®JavaScriptã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ïŒãã€ã¯ãããã³ããšã³ããžã®å æ¬çã¬ã€ã
é²åãç¶ããWebéçºã®äžçã«ãããŠãå€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšã¯å°é£ãªäœæ¥ãšãªãåŸãŸããåŸæ¥ã®ã¢ããªã·ãã¯ãªã¢ãŒããã¯ãã£ã¯ãéçºæéã®å¢å ããããã€ã®ããã«ããã¯ãã³ãŒãå質ã®ç¶æã«ããã課é¡ã«ã€ãªããããšããããããŸãããã€ã¯ãããã³ããšã³ãã¯ããããã®èª²é¡ã«å¯ŸåŠããããã®åŒ·åãªã¢ãŒããã¯ãã£ãã¿ãŒã³ãšããŠç»å ŽããããŒã ããã倧ããªWebã¢ããªã±ãŒã·ã§ã³ã®ç¬ç«ããéšåãæ§ç¯ãããããã€ããããšãå¯èœã«ããŸãããã€ã¯ãããã³ããšã³ããå®è£ ããããã®æãææãªæè¡ã®1ã€ããWebpack 5ã§å°å ¥ãããJavaScriptã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã§ãã
ãã€ã¯ãããã³ããšã³ããšã¯ïŒ
ãã€ã¯ãããã³ããšã³ãã¯ãããã³ããšã³ãã¢ããªãããå°ããç¬ç«ãããŠãããã«åè§£ããã¢ãŒããã¯ãã£ã¹ã¿ã€ã«ã§ããããããã®ãŠãããã¯ç°ãªãããŒã ã«ãã£ãŠèªåŸçã«éçºããã¹ãããããã€ããããšãã§ããŸããåãã€ã¯ãããã³ããšã³ãã¯ç¹å®ã®ããžãã¹ãã¡ã€ã³ãæ©èœãæ åœããå®è¡æã«çµã¿åããããŠå®å šãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã圢æããŸãã
ãããäŒç€Ÿã«äŸããŠã¿ãŸãããã1ã€ã®å·šå€§ãªéçºããŒã ãæã€ä»£ããã«ãç¹å®ã®åéã«çŠç¹ãåœãŠãè€æ°ã®å°èŠæš¡ãªããŒã ãååšããŸããåããŒã ã¯ç¬ç«ããŠäœæ¥ã§ãããããéçºãµã€ã¯ã«ãéããªããã¡ã³ããã³ã¹ã容æã«ãªããŸããAmazonã®ãããªå€§èŠæš¡ãªeã³ããŒã¹ãã©ãããã©ãŒã ãèããŠã¿ãŠãã ããã補åã«ã¿ãã°ãã·ã§ããã³ã°ã«ãŒãããã§ãã¯ã¢ãŠãããã»ã¹ããŠãŒã¶ãŒã¢ã«ãŠã³ã管çãªã©ããããããç°ãªãããŒã ã管çããŠãããããããŸããããããã¯ãã¹ãŠç¬ç«ãããã€ã¯ãããã³ããšã³ããšãªãåŸãŸãã
ãã€ã¯ãããã³ããšã³ãã®å©ç¹ïŒ
- ç¬ç«ãããããã€ïŒ ããŒã ã¯ã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã«åœ±é¿ãäžããããšãªãããã€ã¯ãããã³ããšã³ããç¬ç«ããŠãããã€ã§ããŸããããã«ããããããã€ã®ãªã¹ã¯ã軜æžããããªãªãŒã¹ãµã€ã¯ã«ãéããªããŸãã
- æè¡ã«äŸåããªãïŒ ç°ãªããã€ã¯ãããã³ããšã³ãããç°ãªãæè¡ããã¬ãŒã ã¯ãŒã¯ïŒäŸïŒReactãAngularãVue.jsïŒã䜿çšããŠæ§ç¯ã§ããŸããããã«ãããããŒã ã¯ç¹å®ã®ããŒãºã«æé©ãªæè¡ãéžæããã¢ããªã±ãŒã·ã§ã³å šäœãæžãçŽãããšãªãæ°ããæè¡ã段éçã«æ¡çšã§ããŸããããããŒã ã補åã«ã¿ãã°ã«Reactããå¥ã®ããŒã ãããŒã±ãã£ã³ã°ã®ã©ã³ãã£ã³ã°ããŒãžã«Vue.jsãã3çªç®ã®ããŒã ããã§ãã¯ã¢ãŠãããã»ã¹ã«Angularã䜿çšããŠãããšæ³åããŠã¿ãŠãã ããã
- ããŒã ã®èªåŸæ§ã®åäžïŒ ããŒã ã¯èªåãã¡ã®ãã€ã¯ãããã³ããšã³ããå®å šã«ææãããããèªåŸæ§ãé«ãŸããæææ±ºå®ãéããªããéçºè ã®çç£æ§ãåäžããŸãã
- ã¹ã±ãŒã©ããªãã£ã®åäžïŒ ãã€ã¯ãããã³ããšã³ãã«ãããåã ã®ãã€ã¯ãããã³ããšã³ããç°ãªããµãŒããŒã«ãããã€ããããšã§ãã¢ããªã±ãŒã·ã§ã³ãæ°Žå¹³ã«ã¹ã±ãŒã«ã§ããŸãã
- ã³ãŒãã®åå©çšæ§ïŒ å ±æã³ã³ããŒãã³ããã©ã€ãã©ãªã¯ããã€ã¯ãããã³ããšã³ãéã§ç°¡åã«å ±æã§ããŸãã
- ä¿å®ã®å®¹æãïŒ å°èŠæš¡ãªã³ãŒãããŒã¹ã¯ãäžè¬çã«çè§£ãä¿å®ããããã°ã容æã§ãã
ãã€ã¯ãããã³ããšã³ãã®èª²é¡ïŒ
- è€éæ§ã®å¢å ïŒ è€æ°ã®ãã€ã¯ãããã³ããšã³ãã管çããããšã¯ãç¹ã«éä¿¡ãç¶æ 管çããããã€ã®èгç¹ãããã¢ãŒããã¯ãã£å šäœã®è€éæ§ãå¢ãå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã®ãªãŒããŒãããïŒ è€æ°ã®ãã€ã¯ãããã³ããšã³ããèªã¿èŸŒãããšã¯ãç¹ã«é©åã«æé©åãããŠããªãå Žåãããã©ãŒãã³ã¹ã®ãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸãã
- 暪æçé¢å¿äºïŒ èªèšŒãèªå¯ãããŒãèšå®ãªã©ã®æšªæçé¢å¿äºã®åŠçã¯ããã€ã¯ãããã³ããšã³ãã¢ãŒããã¯ãã£ã§ã¯å°é£ãªå ŽåããããŸãã
- éçšã®ãªãŒããŒãããïŒ è€æ°ã®ãã€ã¯ãããã³ããšã³ãã®ãããã€ãšç£èŠã管çããããã«ãæçããDevOpsãã©ã¯ãã£ã¹ãšã€ã³ãã©ã¹ãã©ã¯ãã£ãå¿ èŠã§ãã
JavaScriptã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ãšã¯ïŒ
JavaScriptã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã¯ãåå¥ã«ã³ã³ãã€ã«ãããJavaScriptã¢ããªã±ãŒã·ã§ã³éã§å®è¡æã«ã³ãŒããå ±æã§ããWebpack 5ã®æ©èœã§ããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®äžéšãä»ã®ã¢ããªã±ãŒã·ã§ã³ãå©çšã§ãããã¢ãžã¥ãŒã«ããšããŠå ¬éã§ããnpmã®ãããªäžå€®ãªããžããªã«å ¬éããå¿ èŠããªããªããŸãã
ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã¯ãåã¢ããªã±ãŒã·ã§ã³ãç¬èªã®æ©èœãæäŸããä»ã®ã¢ããªã±ãŒã·ã§ã³ããæ©èœãæ¶è²»ã§ãããé£ååãããã¢ããªã±ãŒã·ã§ã³ã®ãšã³ã·ã¹ãã ãäœæããæ¹æ³ã ãšèããŠãã ãããããã«ããããã«ãæã®äŸåé¢ä¿ãäžèŠã«ãªããçã«ç¬ç«ãããããã€ãå¯èœã«ãªããŸãã
äŸãã°ããã¶ã€ã³ã·ã¹ãã ããŒã ã¯UIã³ã³ããŒãã³ããã¢ãžã¥ãŒã«ãšããŠå ¬éããããŸããŸãªã¢ããªã±ãŒã·ã§ã³ããŒã ã¯ãããã®ã³ã³ããŒãã³ããnpmããã±ãŒãžãšããŠã€ã³ã¹ããŒã«ããããšãªãããã¶ã€ã³ã·ã¹ãã ã¢ããªã±ãŒã·ã§ã³ããçŽæ¥å©çšã§ããŸãããã¶ã€ã³ã·ã¹ãã ããŒã ãã³ã³ããŒãã³ããæŽæ°ãããšããã®å€æŽã¯ãã¹ãŠã®å©çšåŽã¢ããªã±ãŒã·ã§ã³ã«èªåçã«åæ ãããŸãã
ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã®äž»èŠæŠå¿µïŒ
- ãã¹ãïŒHostïŒïŒ ãªã¢ãŒãã¢ãžã¥ãŒã«ãæ¶è²»ããã¡ã€ã³ã®ã¢ããªã±ãŒã·ã§ã³ã
- ãªã¢ãŒãïŒRemoteïŒïŒ ä»ã®ã¢ããªã±ãŒã·ã§ã³ãæ¶è²»ããããã«ã¢ãžã¥ãŒã«ãå ¬éããã¢ããªã±ãŒã·ã§ã³ã
- å ±æã¢ãžã¥ãŒã«ïŒShared ModulesïŒïŒ ãã¹ããšãªã¢ãŒãã¢ããªã±ãŒã·ã§ã³éã§å ±æãããã¢ãžã¥ãŒã«ïŒäŸïŒReactãLodashïŒãã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã¯ãåã¢ãžã¥ãŒã«ã®ããŒãžã§ã³ã1ã€ã ãããŒããããããã«ãå ±æã¢ãžã¥ãŒã«ã®ããŒãžã§ãã³ã°ãšéè€æé€ãèªåçã«åŠçã§ããŸãã
- å ¬éã¢ãžã¥ãŒã«ïŒExposed ModulesïŒïŒ ãªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ããä»ã®ã¢ããªã±ãŒã·ã§ã³ãå©çšã§ããããã«æäŸãããç¹å®ã®ã¢ãžã¥ãŒã«ã
- RemoteEntry.jsïŒ ãªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ã®å ¬éã¢ãžã¥ãŒã«ã«é¢ããã¡ã¿ããŒã¿ãå«ããWebpackã«ãã£ãŠçæããããã¡ã€ã«ããã¹ãã¢ããªã±ãŒã·ã§ã³ã¯ãã®ãã¡ã€ã«ã䜿çšããŠãªã¢ãŒãã¢ãžã¥ãŒã«ãæ€åºããããŒãããŸãã
Webpack 5ã§ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ãèšå®ããïŒå®è·µã¬ã€ã
Webpack 5ã§ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ãèšå®ããå®è·µçãªäŸãèŠãŠãããŸãããããã¹ãã¢ããªã±ãŒã·ã§ã³ãšãªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ãšãã2ã€ã®ã·ã³ãã«ãªã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ãã³ã³ããŒãã³ããå ¬éãããã¹ãã¢ããªã±ãŒã·ã§ã³ããããæ¶è²»ããŸãã
1. ãããžã§ã¯ãã®ã»ããã¢ãã
ã¢ããªã±ãŒã·ã§ã³çšã« `host` ãš `remote` ãšãã2ã€ã®å¥ã ã®ãã£ã¬ã¯ããªãäœæããŸãã
```bash mkdir host remote cd host npm init -y npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev npm install react react-dom cd ../remote npm init -y npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev npm install react react-dom ```2. ãªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ã®èšå®
`remote` ãã£ã¬ã¯ããªã«ã以äžã®ãã¡ã€ã«ãäœæããŸãïŒ
- `src/index.js`ïŒã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãŒãã€ã³ãã
- `src/RemoteComponent.jsx`ïŒå ¬éãããã³ã³ããŒãã³ãã
- `webpack.config.js`ïŒWebpackã®èšå®ãã¡ã€ã«ã
src/index.jsïŒ
```javascript import React from 'react'; import ReactDOM from 'react-dom/client'; import RemoteComponent from './RemoteComponent'; const App = () => (Remote Application
src/RemoteComponent.jsxïŒ
```javascript import React from 'react'; const RemoteComponent = () => (This is a Remote Component!
Rendered from the Remote Application.
webpack.config.jsïŒ
```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); const path = require('path'); module.exports = { entry: './src/index', mode: 'development', devServer: { port: 3001, static: { directory: path.join(__dirname, 'dist'), }, }, output: { publicPath: 'auto', }, module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-react', '@babel/preset-env'], }, }, }, ], }, plugins: [ new ModuleFederationPlugin({ name: 'remote', filename: 'remoteEntry.js', exposes: { './RemoteComponent': './src/RemoteComponent', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, }, }), new HtmlWebpackPlugin({ template: './public/index.html', }), ], resolve: { extensions: ['.js', '.jsx'], }, }; ```åºæ¬çãªHTMLæ§é ãæã€ `public/index.html` ãäœæããŸããéèŠãªã®ã¯ `
` ã§ãã3. ãã¹ãã¢ããªã±ãŒã·ã§ã³ã®èšå®
`host` ãã£ã¬ã¯ããªã«ã以äžã®ãã¡ã€ã«ãäœæããŸãïŒ
- `src/index.js`ïŒã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãŒãã€ã³ãã
- `webpack.config.js`ïŒWebpackã®èšå®ãã¡ã€ã«ã
src/index.jsïŒ
```javascript import React, { Suspense } from 'react'; import ReactDOM from 'react-dom/client'; const RemoteComponent = React.lazy(() => import('remote/RemoteComponent')); const App = () => (Host Application
webpack.config.jsïŒ
```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); const path = require('path'); module.exports = { entry: './src/index', mode: 'development', devServer: { port: 3000, static: { directory: path.join(__dirname, 'dist'), }, }, output: { publicPath: 'auto', }, module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-react', '@babel/preset-env'], }, }, }, ], }, plugins: [ new ModuleFederationPlugin({ name: 'host', remotes: { remote: 'remote@http://localhost:3001/remoteEntry.js', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, }, }), new HtmlWebpackPlugin({ template: './public/index.html', }), ], resolve: { extensions: ['.js', '.jsx'], }, }; ```åºæ¬çãªHTMLæ§é ãæã€ `public/index.html` ãäœæããŸãïŒãªã¢ãŒãã¢ããªãšåæ§ïŒãéèŠãªã®ã¯ `
` ã§ãã4. Babelã®ã€ã³ã¹ããŒã«
`host` ãš `remote` ã®äž¡æ¹ã®ãã£ã¬ã¯ããªã§ãBabelã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãïŒ
```bash npm install --save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader ```5. ã¢ããªã±ãŒã·ã§ã³ã®å®è¡
`host` ãš `remote` ã®äž¡æ¹ã®ãã£ã¬ã¯ããªã§ã`package.json`ã«ä»¥äžã®ã¹ã¯ãªããã远å ããŸãïŒ
```json "scripts": { "start": "webpack serve" } ```ã§ã¯ãäž¡æ¹ã®ã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãïŒ
```bash cd remote npm start cd ../host npm start ```ãã©ãŠã¶ãéãã`http://localhost:3000`ã«ã¢ã¯ã»ã¹ããŠãã ããããã¹ãã¢ããªã±ãŒã·ã§ã³å ã«ãªã¢ãŒãã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãããŠããã®ãèŠããã¯ãã§ãã
äž»èŠãªèšå®ãªãã·ã§ã³ã®èª¬æïŒ
- `name`: ã¢ããªã±ãŒã·ã§ã³ã®äžæã®ååã
- `filename`: å ¬éãããã¢ãžã¥ãŒã«ã«é¢ããã¡ã¿ããŒã¿ãå«ããã¡ã€ã«ã®ååïŒäŸïŒ `remoteEntry.js`ïŒã
- `exposes`: ã©ã®ã¢ãžã¥ãŒã«ãå ¬éããããæå®ãããã¢ãžã¥ãŒã«åãšãã¡ã€ã«ãã¹ã®ãããã³ã°ã
- `remotes`: åãªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ã®remoteEntry.jsãã¡ã€ã«ãèŠã€ããå Žæãæå®ããããªã¢ãŒãã¢ããªã±ãŒã·ã§ã³åãšURLã®ãããã³ã°ã
- `shared`: ãã¹ããšãªã¢ãŒãã¢ããªã±ãŒã·ã§ã³éã§å ±æãããã¹ãã¢ãžã¥ãŒã«ã®ãªã¹ãã`singleton: true` ãªãã·ã§ã³ã¯ãåå ±æã¢ãžã¥ãŒã«ã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã ãããŒããããããšãä¿èšŒããŸãã`eager: true` ãªãã·ã§ã³ã¯ãå ±æã¢ãžã¥ãŒã«ãæ©æã«ïŒã€ãŸããä»ã®ã¢ãžã¥ãŒã«ããåã«ïŒããŒããããããšãä¿èšŒããŸãã
é«åºŠãªã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³æè¡
ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã¯ãããã«æŽç·Žããããã€ã¯ãããã³ããšã³ãã¢ãŒããã¯ãã£ãæ§ç¯ããã®ã«åœ¹ç«ã€å€ãã®é«åºŠãªæ©èœãæäŸããŸãã
åçãªã¢ãŒã
Webpackã®èšå®ã«ãªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ã®URLãããŒãã³ãŒãã£ã³ã°ãã代ããã«ãå®è¡æã«åçã«ããŒãããããšãã§ããŸããããã«ããããã¹ãã¢ããªã±ãŒã·ã§ã³ãåãã«ãããããšãªãããªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ã®å Žæãç°¡åã«æŽæ°ã§ããŸãã
äŸãã°ããªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ã®URLãèšå®ãã¡ã€ã«ãããŒã¿ããŒã¹ã«ä¿åããJavaScriptã䜿çšããŠåçã«ããŒãããããšãã§ããŸãã
```javascript // In webpack.config.js remotes: { remote: `promise new Promise(resolve => { const urlParams = new URLSearchParams(window.location.search); const remoteUrl = urlParams.get('remote'); // Assume remoteUrl is something like 'http://localhost:3001/remoteEntry.js' const script = document.createElement('script'); script.src = remoteUrl; script.onload = () => { // the key of module federation is that the remote app is // available using the name in the remote resolve(window.remote); }; document.head.appendChild(script); })`, }, ```ããã§ãã¯ãšãªãã©ã¡ãŒã¿ `?remote=http://localhost:3001/remoteEntry.js` ãä»ããŠãã¹ãã¢ããªãããŒãã§ããŸãã
ããŒãžã§ã³ç®¡çãããå ±æã¢ãžã¥ãŒã«
ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã¯ãå ±æã¢ãžã¥ãŒã«ã®ããŒãžã§ãã³ã°ãšéè€æé€ãèªåçã«åŠçããäºææ§ã®ããããŒãžã§ã³ã®åã¢ãžã¥ãŒã«ã1ã€ã ãããŒããããããã«ããŸããããã¯ãå€ãã®äŸåé¢ä¿ãæã€å€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ãæ±ãå Žåã«ç¹ã«éèŠã§ãã
Webpackã®èšå®ã§ãåå ±æã¢ãžã¥ãŒã«ã®ããŒãžã§ã³ç¯å²ãæå®ã§ããŸãã
```javascript // In webpack.config.js shared: { react: { singleton: true, eager: true, requiredVersion: '^18.0.0' }, 'react-dom': { singleton: true, eager: true, requiredVersion: '^18.0.0' }, }, ```ã«ã¹ã¿ã ã¢ãžã¥ãŒã«ããŒããŒ
ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã§ã¯ãç°ãªããœãŒã¹ããããŸãã¯ç°ãªã圢åŒã§ã¢ãžã¥ãŒã«ãããŒãããããã«äœ¿çšã§ããã«ã¹ã¿ã ã¢ãžã¥ãŒã«ããŒããŒãå®çŸ©ã§ããŸããããã¯ãCDNãã«ã¹ã¿ã ã¢ãžã¥ãŒã«ã¬ãžã¹ããªããã¢ãžã¥ãŒã«ãããŒãããã®ã«åœ¹ç«ã¡ãŸãã
ãã€ã¯ãããã³ããšã³ãéã®ç¶æ å ±æ
ãã€ã¯ãããã³ããšã³ãã¢ãŒããã¯ãã£ã®èª²é¡ã®1ã€ã¯ãç°ãªããã€ã¯ãããã³ããšã³ãéã§ç¶æ ãå ±æããããšã§ãããã®èª²é¡ã«å¯ŸåŠããããã«ãããã€ãã®ã¢ãããŒãããããŸãïŒ
- URLããŒã¹ã®ç¶æ 管çïŒ ç¶æ ãURLã«ä¿åããURLã䜿çšããŠãã€ã¯ãããã³ããšã³ãéã§éä¿¡ããŸããããã¯ã·ã³ãã«ã§çŽæ¥çãªã¢ãããŒãã§ãããè€éãªç¶æ ã«ã¯æ±ãã«ãããªãå¯èœæ§ããããŸãã
- ã«ã¹ã¿ã ã€ãã³ãïŒ ã«ã¹ã¿ã ã€ãã³ãã䜿çšããŠããã€ã¯ãããã³ããšã³ãéã§ç¶æ ã®å€æŽããããŒããã£ã¹ãããŸããããã«ããããã€ã¯ãããã³ããšã³ãéã®ççµåãå¯èœã«ãªããŸãããã€ãã³ãã®ãµãã¹ã¯ãªãã·ã§ã³ç®¡çãé£ãããªãããšããããŸãã
- å ±æç¶æ 管çã©ã€ãã©ãªïŒ ReduxãMobXã®ãããªå ±æç¶æ 管çã©ã€ãã©ãªã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³å šäœã®ç¶æ ã管çããŸããããã«ãããç¶æ ã管çããããã®äžå åãããäžè²«ããæ¹æ³ãæäŸãããŸãããç¹å®ç¶æ 管çã©ã€ãã©ãªãžã®äŸåãçããå¯èœæ§ããããŸãã
- ã¡ãã»ãŒãžãããŒã«ãŒïŒ RabbitMQãKafkaã®ãããªã¡ãã»ãŒãžãããŒã«ãŒã䜿çšããŠããã€ã¯ãããã³ããšã³ãéã®éä¿¡ãšç¶æ å ±æãä¿é²ããŸããããã¯ããè€éãªè§£æ±ºçã§ãããé«åºŠãªæè»æ§ãšã¹ã±ãŒã©ããªãã£ãæäŸããŸãã
ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã§ãã€ã¯ãããã³ããšã³ããå®è£ ããããã®ãã¹ããã©ã¯ãã£ã¹
ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã§ãã€ã¯ãããã³ããšã³ããå®è£ ããéã«çæãã¹ããã¹ããã©ã¯ãã£ã¹ãããã€ã玹ä»ããŸãïŒ
- åãã€ã¯ãããã³ããšã³ãã®æç¢ºãªå¢çãå®çŸ©ããïŒ åãã€ã¯ãããã³ããšã³ãã¯ãç¹å®ã®ããžãã¹ãã¡ã€ã³ãŸãã¯æ©èœãæ åœããæç¢ºã«å®çŸ©ãããã€ã³ã¿ãŒãã§ãŒã¹ãæã€ã¹ãã§ãã
- äžè²«ããæè¡ã¹ã¿ãã¯ã䜿çšããïŒ ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã§ã¯ãç°ãªããã€ã¯ãããã³ããšã³ãã«ç°ãªãæè¡ã䜿çšã§ããŸãããè€éããæžããä¿å®æ§ãåäžãããããã«ãäžè²«ããæè¡ã¹ã¿ãã¯ã䜿çšããããšãäžè¬çã«è¯ãèãã§ãã
- æç¢ºãªéä¿¡ãããã³ã«ã確ç«ããïŒ ãã€ã¯ãããã³ããšã³ããäºãã«ã©ã®ããã«å¯Ÿè©±ãããã«ã€ããŠãæç¢ºãªéä¿¡ãããã³ã«ãå®çŸ©ããŸãã
- ãããã€ããã»ã¹ãèªååããïŒ ãã€ã¯ãããã³ããšã³ããç¬ç«ããŠç¢ºå®ã«ãããã€ã§ããããã«ããããã€ããã»ã¹ãèªååããŸããCI/CDãã€ãã©ã€ã³ãInfrastructure-as-CodeããŒã«ã®äœ¿çšãæ€èšããŠãã ããã
- ãã€ã¯ãããã³ããšã³ãã®ããã©ãŒãã³ã¹ãç£èŠããïŒ ããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ãã察åŠããããã«ããã€ã¯ãããã³ããšã³ãã®ããã©ãŒãã³ã¹ãç£èŠããŸããGoogle AnalyticsãNew RelicãDatadogãªã©ã®ããŒã«ã䜿çšããŠãã ããã
- å ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããïŒ ã¢ããªã±ãŒã·ã§ã³ãé害ã«å¯ŸããŠå埩åãæã€ããã«ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŸãã
- 忣åã®ã¬ããã³ã¹ã¢ãã«ãæ¡çšããïŒ å šäœçãªäžè²«æ§ãšå質ãç¶æãã€ã€ãããŒã ãèªèº«ã®ãã€ã¯ãããã³ããšã³ãã«é¢ããæ±ºå®ãäžããããã«æš©éãäžããŸãã
ã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã®å®äžçã§ã®æŽ»çšäŸ
å ·äœçãªã±ãŒã¹ã¹ã¿ãã£ã¯æ©å¯æ å ±ã§ããããšãå€ãã§ãããã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ãéåžžã«åœ¹ç«ã€äžè¬çãªã·ããªãªãããã€ã玹ä»ããŸãïŒ
- Eã³ããŒã¹ãã©ãããã©ãŒã ïŒ åè¿°ã®éããå€§èŠæš¡ãªEã³ããŒã¹ãã©ãããã©ãŒã ã¯ãã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã䜿çšããŠã補åã«ã¿ãã°ãã·ã§ããã³ã°ã«ãŒãããã§ãã¯ã¢ãŠãããã»ã¹ããŠãŒã¶ãŒã¢ã«ãŠã³ã管çã®ããã®ç¬ç«ãããã€ã¯ãããã³ããšã³ããæ§ç¯ã§ããŸããããã«ãããç°ãªãããŒã ããããã®æ©èœã«ç¬ç«ããŠåãçµã¿ãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã«åœ±é¿ãäžããããšãªããããã€ã§ããŸããã°ããŒãã«ãªãã©ãããã©ãŒã ã§ã¯ããªã¢ãŒãã¢ãžã¥ãŒã«ãä»ããŠç°ãªãå°ååãã®æ©èœãã«ã¹ã¿ãã€ãºã§ããŸãã
- éèãµãŒãã¹ã¢ããªã±ãŒã·ã§ã³ïŒ éèãµãŒãã¹ã¢ããªã±ãŒã·ã§ã³ã¯ãå€ãã®å Žåã倿°ã®ç°ãªãæ©èœãåããè€éãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæã£ãŠããŸããã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã䜿çšããŠãç°ãªãå£åº§ã¿ã€ããååŒãã©ãããã©ãŒã ãã¬ããŒãããã·ã¥ããŒãã®ããã®ç¬ç«ãããã€ã¯ãããã³ããšã³ããæ§ç¯ã§ããŸããç¹å®ã®åœã«åºæã®ã³ã³ãã©ã€ã¢ã³ã¹æ©èœã¯ãã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ãä»ããŠæäŸã§ããŸãã
- ãã«ã¹ã±ã¢ããŒã¿ã«ïŒ ãã«ã¹ã±ã¢ããŒã¿ã«ã¯ãã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã䜿çšããŠãæ£è 管çãäºçŽã¹ã±ãžã¥ãŒã«ãå»çèšé²ã¢ã¯ã»ã¹ã®ããã®ç¬ç«ãããã€ã¯ãããã³ããšã³ããæ§ç¯ã§ããŸããç°ãªãä¿éºãããã€ããŒãå°ååãã®ç°ãªãã¢ãžã¥ãŒã«ãåçã«ããŒãã§ããŸãã
- ã³ã³ãã³ã管çã·ã¹ãã ïŒCMSïŒïŒ CMSã¯ãã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã䜿çšããŠããµãŒãããŒãã£éçºè ããã®ãªã¢ãŒãã¢ãžã¥ãŒã«ãããŒãããããšã§ããŠãŒã¶ãŒãèªåã®ãŠã§ããµã€ãã«ã«ã¹ã¿ã æ©èœã远å ã§ããããã«ããŸããç°ãªãããŒãããã©ã°ã€ã³ããŠã£ãžã§ãããç¬ç«ãããã€ã¯ãããã³ããšã³ããšããŠé åžã§ããŸãã
- åŠç¿ç®¡çã·ã¹ãã ïŒLMSïŒïŒ LMSã¯ãç¬ç«ããŠéçºãããã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ãä»ããŠçµ±äžããããã©ãããã©ãŒã ã«çµ±åãããã³ãŒã¹ãæäŸã§ããŸããåã ã®ã³ãŒã¹ã®æŽæ°ã¯ããã©ãããã©ãŒã å šäœã®åãããã€ãå¿ èŠãšããŸããã
çµè«
Webpack 5ã®JavaScriptã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã¯ããã€ã¯ãããã³ããšã³ãã¢ãŒããã¯ãã£ãæ§ç¯ããããã®åŒ·åã§æè»ãªæ¹æ³ãæäŸããŸããããã«ãããåå¥ã«ã³ã³ãã€ã«ãããJavaScriptã¢ããªã±ãŒã·ã§ã³éã§å®è¡æã«ã³ãŒããå ±æã§ããç¬ç«ãããããã€ãæè¡ã®å€æ§æ§ãããŒã ã®èªåŸæ§ã®åäžãå®çŸããŸãããã®ã¬ã€ãã§æŠèª¬ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã掻çšããŠãã¹ã±ãŒã©ãã«ã§ä¿å®æ§ãé«ãã驿°çãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
ããã³ããšã³ãéçºã®æªæ¥ã¯ãééããªãã¢ãžã¥ãŒã«åãã忣åãããã¢ãŒããã¯ãã£ã«åãã£ãŠããŸããã¢ãžã¥ãŒã«ãã§ãã¬ãŒã·ã§ã³ã¯ããããã®çŸä»£çãªã·ã¹ãã ãæ§ç¯ããããã®éèŠãªããŒã«ãæäŸããããŒã ãããéããããæè»ã«ããããŠããå埩åã®ããè€éãªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããããã«ããŸããæè¡ãæçããã«ã€ããŠãããã«é©æ°çãªãŠãŒã¹ã±ãŒã¹ããã¹ããã©ã¯ãã£ã¹ãç»å ŽããããšãæåŸ ãããŸãã